package com.english.service;

import com.english.entity.User;
import com.english.mapper.UserMapper;
import com.english.mapper.LessonMapper;

import com.english.utils.WechatUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.english.entity.Lesson;
import com.english.entity.LessonLog;
import com.english.mapper.LessonLogMapper;

/**
 * 用户服务层
 * 处理用户相关的业务逻辑
 *
 * @author sqh
 * @since 2025-01-15
 */
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private LessonMapper lessonMapper;

    @Autowired
    private WechatUtil wechatUtil;

    @Autowired
    private LessonLogMapper lessonLogMapper;

    /**
     * 微信登录
     * @param code 微信授权码
     * @param name 用户姓名
     * @param phone 手机号（学生用户必填）
     * @param role 用户角色 0=学生, 1=管理员
     * @return 登录结果
     */
    public Map<String, Object> wechatLogin(String code, String name, String phone, Integer role) {
        Map<String, Object> result = new HashMap<>();

        try {
            // 1. 通过code获取微信openid
            Map<String, String> sessionInfo = wechatUtil.getWechatSession(code);
            if (sessionInfo == null) {
                result.put("success", false);
                result.put("message", "微信授权失败");
                return result;
            }

            String openid = sessionInfo.get("openid");

            // 2. 检查用户是否已存在
            User existingUser = userMapper.selectByWechatId(openid);

            if (existingUser != null) {
                // 用户已存在，直接返回用户信息
                result.put("success", true);
                result.put("message", "登录成功");
                result.put("user", existingUser);
                result.put("token", generateToken(existingUser));
                result.put("isFirstLogin", false);
            } else {
                // 新用户，需要验证必填信息
                if (name == null || name.trim().isEmpty()) {
                    result.put("success", false);
                    result.put("message", "姓名不能为空");
                    return result;
                }

                if (role == null) {
                    result.put("success", false);
                    result.put("message", "用户角色不能为空");
                    return result;
                }

                // 学生角色需要验证手机号
                if (role == 0 && (phone == null || phone.trim().isEmpty())) {
                    result.put("success", false);
                    result.put("message", "学生用户需要填写家长手机号");
                    return result;
                }

                // 创建用户记录
                User newUser = new User();
                newUser.setWechatId(openid);
                newUser.setName(name);
                newUser.setPhone(phone);
                newUser.setRole(role);
                newUser.setCreateTime(new Date());
                newUser.setUpdateTime(new Date());

                // 保存用户信息
                int insertResult = userMapper.insert(newUser);

                if (insertResult > 0) {
                    // 获取完整的用户信息（包含ID）
                    User savedUser = userMapper.selectByWechatId(openid);

                    result.put("success", true);
                    result.put("message", "注册成功");
                    result.put("user", savedUser);
                    result.put("token", generateToken(savedUser));
                    result.put("isFirstLogin", true);
                } else {
                    result.put("success", false);
                    result.put("message", "用户注册失败");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            String errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.contains("40163")) {
                result.put("success", false);
                result.put("message", "授权码已被使用，请重新获取授权码");
            } else {
                result.put("success", false);
                result.put("message", "登录失败：" + e.getMessage());
            }
        }

        return result;
    }

    /**
     * 检查用户是否存在（仅检查，不创建用户）
     * @param code 微信授权码
     * @return 检查结果
     */
    public Map<String, Object> checkUserExists(String code) {
        Map<String, Object> result = new HashMap<>();

        try {
            // 1. 通过code获取微信openid
            Map<String, String> sessionInfo = wechatUtil.getWechatSession(code);
            if (sessionInfo == null) {
                result.put("success", false);
                result.put("message", "微信授权失败");
                return result;
            }

            String openid = sessionInfo.get("openid");

            // 2. 检查用户是否已存在
            User existingUser = userMapper.selectByWechatId(openid);

            if (existingUser != null) {
                // 用户已存在
                result.put("success", true);
                result.put("message", "用户已存在");
                result.put("user", existingUser);
                result.put("token", generateToken(existingUser));
                result.put("exists", true);
            } else {
                // 用户不存在
                result.put("success", true);
                result.put("message", "用户不存在，需要注册");
                result.put("exists", false);
            }

        } catch (Exception e) {
            e.printStackTrace();
            String errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.contains("40163")) {
                result.put("success", false);
                result.put("message", "授权码已被使用，请重新获取授权码");
            } else {
                result.put("success", false);
                result.put("message", "检查用户失败：" + e.getMessage());
            }
        }

        return result;
    }

    /**
     * 生成用户token
     * @param user 用户信息
     * @return token
     */
    private String generateToken(User user) {
        // 简单的token生成逻辑，实际项目中应该使用JWT
        return "token_" + user.getWechatId() + "_" + System.currentTimeMillis();
    }

    /**
     * 根据微信ID获取用户信息
     * @param wechatId 微信ID
     * @return 用户信息
     */
    public User getUserByWechatId(String wechatId) {
        return userMapper.selectByWechatId(wechatId);
    }

    /**
     * 更新用户信息
     * @param user 用户信息
     * @return 是否成功
     */
    public boolean updateUser(User user) {
        user.setUpdateTime(new Date());
        return userMapper.updateUserById(user) > 0;
    }

    /**
     * 获取用户统计数据
     * @param userId 用户ID
     * @return 统计数据
     */
    public Map<String, Object> getUserStats(Long userId) {
        Map<String, Object> stats = new HashMap<>();

        try {
            // 获取剩余课时
            Integer remainingHours = 0;
            try {
                Lesson lesson = lessonMapper.selectByStudentId(userId);
                if (lesson != null) {
                    remainingHours = lesson.getRemainingHours();
                } else {
                    // 如果学生没有课时记录，自动初始化
                    lesson = new Lesson();
                    lesson.setStudentId(userId);
                    lesson.setTotalHours(0);
                    lesson.setUsedHours(0);
                    lesson.setRemainingHours(0);
                    lessonMapper.insert(lesson);

                    // 插入初始化日志记录
                    LessonLog initLog = new LessonLog();
                    initLog.setStudentId(userId);
                    initLog.setChangeValue(0);
                    initLog.setType(LessonLog.ChangeType.ADJUSTMENT);
                    initLog.setTitle("首次建档");
                    initLog.setDescription("用户首次登录，初始化课时为0");
                    initLog.setTime(new Date());
                    initLog.setAdminId(null); // 系统自动创建

                    lessonLogMapper.insert(initLog);

                    remainingHours = 0;
                }
            } catch (Exception e) {
                // 如果课时表不存在或查询失败，使用默认值
                remainingHours = 12;
            }



        } catch (Exception e) {
            e.printStackTrace();
            // 如果统计失败，返回默认值
            stats.put("remainingHours", 12);
            stats.put("totalBookings", 5);
            stats.put("totalRecharge", 3);
        }

        return stats;
    }
}
